home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / lisp / kcl / akcl / akcl1615.lha / c / sgi4d_emul.s < prev    next >
Text File  |  1989-10-30  |  1KB  |  69 lines

  1. #include <sys/regdef.h>
  2.   
  3.  /*  earith.s for MIPS R2000 processor
  4.       by Doug Katzman
  5.       version 2.1.d dated 7/13/89 15:31 EDT */
  6.  
  7.  # mods 7/13/89:
  8.  #   emul: never conditionally branch
  9.  #   ediv: improved code ordering allows jmp delay slot optimization by 'as'
  10.  #
  11.     .text    
  12.     .align    2
  13.  
  14.     .globl    extended_mul
  15.  #      extended_mul(d, q, r, hp, lp)
  16.  #           unsigned int d, q, r, *hp, *lp;
  17.  #      {
  18.     .ent    extended_mul
  19. extended_mul:
  20.     .frame    sp, 0, ra
  21.  
  22.     mult    a0, a1        # [hi:lo] = d * q
  23.     mfhi    a1
  24.     sll    a1, 1
  25.     mflo    a0
  26.     srl    t7, a0, 31    
  27.     and    a0, 0x7fffffff
  28.     or    a1, t7
  29.     addu    a0, a2        # [a1:a0] += r
  30.     srl    t7, a0, 31    
  31.     and    a0, 0x7fffffff
  32.     addu    a1, t7
  33.     sw    a1, 0(a3)    # *hp = a1
  34.     lw    a3, 16(sp)    # fetch fifth actual argument from stack
  35.     sw    a0, 0(a3)    # *lp = a0
  36.  #      }
  37.     j    ra
  38.     .end    extended_mul
  39.  
  40.     .globl    extended_div
  41.  #       extended_div(d, h, l, qp, rp)
  42.  #            unsigned int d, h, l, *qp, *rp;
  43.  #       {
  44.     .ent    extended_div
  45. extended_div:
  46.     .frame    sp, 0, ra
  47.  
  48.     sll    a2, 1        
  49.     li    v0, 31        # v0 holds number of shifts
  50. loop:
  51.     srl    t7, a2, 31
  52.     sll    a1, 1    
  53.     or    a1, t7
  54.     sll    a2, 1
  55.     subu    t7, a1, a0    # t = h - d
  56.     bltz    t7, underflow
  57.     move    a1, t7
  58.     or    a2, 1
  59. underflow:
  60.     subu    v0, 1
  61.     bnez    v0, loop
  62.     sw    a2, 0(a3)    # *qp = l
  63.     lw    a3, 16(sp)    # fetch fifth actual argument from stack
  64.     sw    a1, 0(a3)    # *rp = h
  65.  #       }
  66.     j    ra
  67.     .end    extended_div
  68.  
  69.